Microestructura del mercado
En este laboratorio usaremos información del Libro de Ordenes de Criptomonedas de diversos exchanges internacionales, con el objetivo primario de visualizar y modelar la microestructura del mercado por medio del comportamiento de Libro de Ordenes y sus caracteristicas como; Matching Engine, Levels, Ask-Bid Volumes, etc.
El modelo de Roll, el cual se enfoca en la microestructura de la dinámica del precio de un activo financiero en horizontes de tiempo en minutos o segundos. El modelo distingue entre las componentes del precio debido al valor fundamental del activo financiero y a aquellas atribuibles a la organización del mercado y procesos de trading. El modelo tiene dos parámetros, C y σ2u, que pueden ser estimados con la información de la varianza y autocovarianza de primer orden del cambio de los precios 4Pt. Se presentan las ecuaciones del modelo para modelar el valor fundamental del activo financiero y para modelar el precio de transacción del mismo activo, y se muestran los cálculos para la diferencia de precios 4Pt, la diferencia de precios 4Pt-1, la multiplicación de las diferencias de precios (4Pt4Pt-1), la varianza de 4Pt, y la covarianza de 4Pt-1 y 4Pt. Los parámetros finales del modelo de Roll se despejan en términos de γ0 y γ1, y quedan expresados como: γ0 = 2C2 + σ2u, σ2u = γ0 - 2C2, γ1 = -C2, y C = -√γ1.
Mientras que la Teoría de Valuación de activos como marco para modelar el precio de un activo financiero riesgoso como un flujo de pagos. Se presenta un modelo simple de utilidad a un período futuro para expresar el valor en el tiempo t de un pago x en t+1. Se utiliza la función de utilidad y se plantea el problema de optimización de la función de utilidad del agente respecto al número de acciones a consumir con restricciones para ct y ct+1. Se obtiene la ecuación que representa el precio del activo riesgoso, Pt, como un proceso estocástico particular, una martingala. Se concluye que el precio del activo riesgoso puede ser modelado como un flujo de pagos.
Visualización de microestructuras con libros de órdenes de exchanges que contengan:
import functions as fn
import data as dt
import visualizations
import pandas as pd
import numpy as np
import ccxt
import plotly.io as pio
Utilizar el módulo CCXT en python para consumir el libro de ordenes de los activos necesarios por cada uno de los exchanges especificados
Ordenes de libros guardados en csv:
Orderbooks1:
- kucoin, bittrex, bitfinex (ETH/BTC)
Orderbooks2:
- kucoin, bittrex, bitfinex (BTC/USDT)
# (ETH/BTC)
files_etc = pd.read_csv('files/orderbooks1.csv')
files_etc
| exchange | datetime | orderbook | |
|---|---|---|---|
| 0 | kucoin | 2023-04-24T17:04:02.574Z | {'ask_size': [1.0874998, 0.3672999, 1.5, 1.5, ... |
| 1 | kucoin | 2023-04-24T17:04:02.920Z | {'ask_size': [1.0874998, 0.3672999, 1.5, 1.5, ... |
| 2 | kucoin | 2023-04-24T17:04:03.197Z | {'ask_size': [1.0874998, 0.3672999, 1.5, 1.5, ... |
| 3 | kucoin | 2023-04-24T17:04:03.541Z | {'ask_size': [1.0874998, 1.8672999, 0.6, 1.5, ... |
| 4 | kucoin | 2023-04-24T17:04:03.816Z | {'ask_size': [1.0874998, 0.3672999, 1.5, 0.6, ... |
| ... | ... | ... | ... |
| 18522 | bitfinex | 2023-04-24T18:03:56.345Z | {'ask_size': [0.5, 1.31704302, 0.5, 1.22561471... |
| 18523 | bitfinex | 2023-04-24T18:03:57.136Z | {'ask_size': [0.5, 1.31704302, 0.5, 1.22561471... |
| 18524 | bitfinex | 2023-04-24T18:03:57.832Z | {'ask_size': [0.5, 1.31704302, 0.5, 1.22561471... |
| 18525 | bitfinex | 2023-04-24T18:03:59.032Z | {'ask_size': [3.82768498, 0.5, 1.31704302, 3.8... |
| 18526 | bitfinex | 2023-04-24T18:03:59.723Z | {'ask_size': [3.82768498, 0.5, 1.31704302, 3.8... |
18527 rows × 3 columns
# (BTC/USDT)
files_btc = pd.read_csv('files/orderbooks2.csv')
files_btc
| exchange | datetime | orderbook | |
|---|---|---|---|
| 0 | kucoin | 2023-04-24T18:04:05.442Z | {'ask_size': [1.76519273, 0.05477487, 0.101045... |
| 1 | kucoin | 2023-04-24T18:04:05.719Z | {'ask_size': [1.76519273, 0.05477487, 0.101045... |
| 2 | kucoin | 2023-04-24T18:04:05.998Z | {'ask_size': [1.76369245, 0.05477487, 0.101045... |
| 3 | kucoin | 2023-04-24T18:04:06.371Z | {'ask_size': [2.32371788, 0.07302856, 0.101045... |
| 4 | kucoin | 2023-04-24T18:04:06.671Z | {'ask_size': [2.32487898, 0.07302856, 0.101045... |
| ... | ... | ... | ... |
| 18603 | bitfinex | 2023-04-24T19:04:00.224Z | {'ask_size': [0.128048, 0.0887, 0.06, 0.128035... |
| 18604 | bitfinex | 2023-04-24T19:04:00.922Z | {'ask_size': [0.128048, 0.0887, 0.06, 0.128035... |
| 18605 | bitfinex | 2023-04-24T19:04:02.094Z | {'ask_size': [0.128048, 0.227238, 0.18728997, ... |
| 18606 | bitfinex | 2023-04-24T19:04:02.800Z | {'ask_size': [0.128048, 0.227238, 0.18728997, ... |
| 18607 | bitfinex | 2023-04-24T19:04:03.536Z | {'ask_size': [0.128048, 0.227238, 0.18728997, ... |
18608 rows × 3 columns
# (ETH/BTC)
series_de_tiempo_1 = fn.OB_ts(pd.read_csv('files/orderbooks1.csv'))
# (BTC/USDT)
series_de_tiempo_2 = fn.OB_ts(pd.read_csv('files/orderbooks2.csv'))
# (ETH/BTC)
series_de_tiempo_1.sample(15)
| exchange | timeStamp | level | Ask_Volume | Bid_Volume | Total_Volume | Mid_Price | VWAP | Spread | |
|---|---|---|---|---|---|---|---|---|---|
| 7357 | kucoin | 2023-04-24T17:42:26.570Z | 200 | 128.739804 | 94.287752 | 223.027556 | 0.067032 | 0.100616 | 0.00025 |
| 1988 | kucoin | 2023-04-24T17:14:22.530Z | 200 | 103.890571 | 126.398825 | 230.289396 | 0.066921 | 0.100437 | 0.000263 |
| 1760 | kucoin | 2023-04-24T17:13:12.278Z | 200 | 106.592526 | 133.904534 | 240.49706 | 0.066909 | 0.100415 | 0.000262 |
| 14220 | bitfinex | 2023-04-24T17:07:56.303Z | 50 | 79.840378 | 38.858004 | 118.698382 | 0.066972 | 0.100479 | 0.000072 |
| 611 | kucoin | 2023-04-24T17:07:15.683Z | 200 | 108.619836 | 119.606719 | 228.226555 | 0.066946 | 0.100472 | 0.000267 |
| 18411 | bitfinex | 2023-04-24T18:02:27.862Z | 50 | 96.719327 | 56.34665 | 153.065977 | 0.066988 | 0.100495 | 0.000048 |
| 15292 | bitfinex | 2023-04-24T17:21:50.846Z | 50 | 77.407435 | 77.078699 | 154.486134 | 0.066868 | 0.100317 | 0.00006 |
| 15693 | bitfinex | 2023-04-24T17:27:07.175Z | 50 | 71.027633 | 57.370576 | 128.398209 | 0.066962 | 0.100457 | 0.000048 |
| 3584 | kucoin | 2023-04-24T17:22:43.990Z | 200 | 90.11977 | 125.880115 | 215.999885 | 0.066925 | 0.100428 | 0.000282 |
| 2805 | kucoin | 2023-04-24T17:18:38.431Z | 200 | 97.983883 | 136.611483 | 234.595366 | 0.066915 | 0.100423 | 0.00026 |
| 17903 | bitfinex | 2023-04-24T17:55:55.366Z | 50 | 71.444473 | 57.920226 | 129.364699 | 0.06699 | 0.1005 | 0.000052 |
| 4982 | kucoin | 2023-04-24T17:30:05.105Z | 200 | 80.258473 | 139.473858 | 219.732331 | 0.06696 | 0.1005 | 0.000264 |
| 15258 | bitfinex | 2023-04-24T17:21:23.616Z | 50 | 123.859662 | 75.072369 | 198.932031 | 0.066869 | 0.100321 | 0.000068 |
| 8808 | kucoin | 2023-04-24T17:49:22.072Z | 200 | 109.927421 | 115.853856 | 225.781277 | 0.066974 | 0.100514 | 0.000249 |
| 7418 | kucoin | 2023-04-24T17:42:44.603Z | 200 | 125.942876 | 105.494186 | 231.437062 | 0.067028 | 0.100608 | 0.000246 |
# (BTC/USDT)
series_de_tiempo_2.sample(15)
| exchange | timeStamp | level | Ask_Volume | Bid_Volume | Total_Volume | Mid_Price | VWAP | Spread | |
|---|---|---|---|---|---|---|---|---|---|
| 13804 | bittrex | 2023-04-24T18:55:44.355Z | 50 | 1.780207 | 3.634274 | 5.414481 | 27356.531985 | 41132.256004 | 834.250516 |
| 6588 | kucoin | 2023-04-24T18:36:59.283Z | 200 | 28.037485 | 58.859869 | 86.897354 | 27384.1915 | 41089.248063 | 42.725 |
| 10529 | kucoin | 2023-04-24T18:56:57.961Z | 200 | 54.694987 | 40.810199 | 95.505186 | 27337.823 | 41019.434697 | 47.936 |
| 10620 | kucoin | 2023-04-24T18:57:24.963Z | 200 | 55.790578 | 40.261441 | 96.05202 | 27342.302 | 41026.272241 | 45.738 |
| 3261 | kucoin | 2023-04-24T18:20:04.815Z | 200 | 54.266432 | 45.515898 | 99.78233 | 27414.5135 | 41136.74716 | 47.353 |
| 556 | kucoin | 2023-04-24T18:06:55.942Z | 200 | 66.685915 | 32.657519 | 99.343434 | 27367.3315 | 41065.078166 | 53.205 |
| 6312 | kucoin | 2023-04-24T18:35:38.789Z | 200 | 29.333641 | 41.340442 | 70.674083 | 27377.427 | 41076.773433 | 37.47 |
| 6852 | kucoin | 2023-04-24T18:38:17.296Z | 200 | 25.994028 | 59.068 | 85.062028 | 27359.8845 | 41053.892731 | 39.041 |
| 13460 | bittrex | 2023-04-24T18:46:00.874Z | 50 | 1.991035 | 3.701348 | 5.692383 | 27330.294477 | 41065.387844 | 748.342764 |
| 1197 | kucoin | 2023-04-24T18:10:06.745Z | 200 | 54.970369 | 35.996532 | 90.966901 | 27367.9545 | 41065.039855 | 47.209 |
| 16245 | bitfinex | 2023-04-24T18:32:56.629Z | 50 | 9.949764 | 17.328731 | 27.278495 | 27407.72 | 41121.590711 | 37.04 |
| 8151 | kucoin | 2023-04-24T18:44:47.116Z | 200 | 28.213799 | 59.870824 | 88.084624 | 27325.1465 | 40999.400987 | 50.791 |
| 13712 | bittrex | 2023-04-24T18:53:09.833Z | 50 | 1.788149 | 3.537587 | 5.325736 | 27341.581526 | 41119.211701 | 805.651028 |
| 12134 | bittrex | 2023-04-24T18:08:41.225Z | 50 | 2.432396 | 3.582965 | 6.015361 | 27332.67477 | 41130.470358 | 881.972048 |
| 403 | kucoin | 2023-04-24T18:06:09.195Z | 200 | 48.631739 | 30.58671 | 79.218449 | 27376.576 | 41076.313433 | 40.786 |
# (ETH/BTC)
microestructura_1 = fn.micro_modelling(series_de_tiempo_1)
# (BTC/USDT)
microestructura_2 = fn.micro_modelling(series_de_tiempo_2)
# (ETH/BTC)
microestructura_1.sample(15)
| Close | Spread | Effective Spread | |
|---|---|---|---|
| timeStamp | |||
| 2023-04-24T17:18:58.093Z | 0.06689 | 0.000068 | 0.000011 |
| 2023-04-24T17:09:48.049Z | 0.066951 | 0.000068 | 0.000054 |
| 2023-04-24T17:54:29.576Z | 0.06697 | 0.000247 | 0.000002 |
| 2023-04-24T17:50:54.355Z | 0.066983 | 0.000248 | 0.000001 |
| 2023-04-24T17:35:28.523Z | 0.06698 | 0.000249 | 0.000004 |
| 2023-04-24T17:08:40.266Z | 0.066928 | 0.000255 | 0.000008 |
| 2023-04-24T17:14:54.582Z | 0.066933 | 0.000257 | 0.000005 |
| 2023-04-24T17:42:42.934Z | 0.067061 | 0.000064 | 0.000015 |
| 2023-04-24T17:24:50.770Z | 0.066904 | 0.000239 | 0.000007 |
| 2023-04-24T17:22:28.216Z | 0.066896 | 0.000261 | 0.000005 |
| 2023-04-24T17:48:45.516Z | 0.066991 | 0.00025 | 0.000003 |
| 2023-04-24T17:20:42.184Z | 0.066855 | 0.00006 | 0.000009 |
| 2023-04-24T17:24:23.279Z | 0.066909 | 0.000258 | 0.000006 |
| 2023-04-24T17:43:38.885Z | 0.067438 | 0.001432 | 0.000012 |
| 2023-04-24T17:31:44.679Z | 0.066949 | 0.000255 | 0.000006 |
# (BTC/USDT)
microestructura_2.sample(15)
| Close | Spread | Effective Spread | |
|---|---|---|---|
| timeStamp | |||
| 2023-04-24T18:24:39.850Z | 27491.8425 | 51.009 | 22.174022 |
| 2023-04-24T18:08:06.443Z | 27357.733 | 53.984 | 8.638551 |
| 2023-04-24T18:53:56.853Z | 27339.449 | 43.934 | 2.176915 |
| 2023-04-24T18:16:49.907Z | 27354.8375 | 45.797 | 2.758821 |
| 2023-04-24T18:27:43.447Z | 27472.1235 | 36.581 | 2.460089 |
| 2023-04-24T18:11:51.190Z | 27361.594 | 49.428 | 6.324842 |
| 2023-04-24T18:19:13.455Z | 27425.1 | 36.76 | 2.106118 |
| 2023-04-24T18:13:52.899Z | 27371.5105 | 41.859 | 4.791754 |
| 2023-04-24T18:40:49.323Z | 27370.18 | 37.32 | 7.105551 |
| 2023-04-24T19:03:13.121Z | 27333.1 | 30.92 | 1.776467 |
| 2023-04-24T18:29:36.011Z | 27456.28 | 35.2 | 8.571180 |
| 2023-04-24T18:42:43.336Z | 27385.556555 | 849.546964 | 4.931479 |
| 2023-04-24T18:21:50.994Z | 27476.149 | 44.348 | 9.382702 |
| 2023-04-24T18:17:41.019Z | 27373.1775 | 44.147 | 2.098667 |
| 2023-04-24T18:58:34.348Z | 27378.477239 | 788.676504 | 8.019090 |
facetas_sdt_1 = visualizations.timeseries_facet_plot(series_de_tiempo_1)
facetas_sdt_1.show(renderer = 'notebook')
facetas_sdt_2 = visualizations.timeseries_facet_plot(series_de_tiempo_2)
facetas_sdt_2.show(renderer = 'notebook')